﻿#pragma once

#include <WinSock2.h>
#include "Const.h"
#include "Protocol.h"

// 游戏状态
typedef enum GameStatus {
    END,            // 已结束
    PLAYING,        // 自己下棋中
    RIVAL_PLAYING   // 对手下棋中
} GameStatus;

// 棋子类型
typedef enum Piece {
    NOTHING,    // 什么也没有
    BLACK,      // 黑棋
    WHITE       // 白棋
} Piece;

typedef struct Game Game;

typedef void(*GameDelete)(Game*);
typedef void(*GameAcceptInvite)(Game*, LPCTSTR, BOOL);
typedef void(*GameDefeat)(Game*);
typedef void(*GameFindUsers)(Game*);
typedef void(*GameInvite)(Game*, LPCTSTR);
typedef void(*GameLogon)(Game*, LPCTSTR);
typedef void(*GameOnGameBoardClicked)(Game*, int, int);
typedef void(*GameRestart)(Game*);

// 游戏
struct Game {
    HBRUSH mBlackBrush;                 // 黑色画刷
    HWND mCallback;                     // 回调
    HDC mDrawer;                        // 绘图者
    HWND mGameBoard;                    // 游戏区域
    BOOL mIsBlack;                      // 黑棋则为 TRUE，白棋则为 FALSE
    POINT mLastPos;                     // 上一次放置棋子的位置
    Piece mPieces[GAME_BOARD_POINT_COUNT_V][GAME_BOARD_POINT_COUNT_H];  // 所有棋子
    TCHAR mRivalName[USERNAME_BUF_LEN]; // 对手的名字
    SOCKET mSocket;                     // 套接字
    GameStatus mStatus;                 // 状态
    TCHAR mUsername[USERNAME_BUF_LEN];  // 用户名
    HBRUSH mWhiteBrush;                 // 白色画刷

    GameDelete deleteSelf;
    GameAcceptInvite acceptInvite;
    GameDefeat defeat;
    GameFindUsers findUsers;
    GameInvite invite;
    GameLogon logon;
    GameOnGameBoardClicked onGameBoardClicked;
    GameRestart restart;
};

Game* New_Game(HWND, HDC, HWND);
